"""
当内部作用域想要使用或修改外部作用域的变量时，可使用global和nonlocal关键字声明该变量，但声明时不能赋值。
1．global关键字
使用global关键字可分为以下两种情况。
（1）变量已在函数外创建，如果需要在函数内使用或修改该变量，须在函数内使用关键字global声明该全局变量。
（2）变量没有在函数外创建，在函数内直接使用global关键字声明全局变量，然后赋值，调用该函数后，会创建新的全局变量，在函数外也可以使用或修改该变量

【例5-15】   分析下面程序的运行结果。
【参考代码】
【程序说明】在fun()函数外创建全局变量num，然后在fun()函数内使用global关键字声明num，此时，函数内的num就是函数外的全局变量num。因此，在函数内num的初始值为5，执行“num += 1”语句后，num的值为6，函数外的num值也为6。
"""
# 函数内作用域访问全局变量使用blobal
# num = 5 					#创建全局变量num
# def fun():					#定义fun()函数
#     global num					#使用global关键字声明num
#     num += 1					#num加1
#     print('函数内num的值：', num)	#函数内输出num的值
# fun()						#调用fun()函数
# print('函数外num的值：', num)		             #函数外输出num的值

"""
2．nonlocal关键字
     如果要在一个嵌套的函数内使用或修改嵌套外部作用域中的变量，须使用nonlocal关键字修饰该变量。
【例5-16】   分析下面程序的运行结果。
【参考代码】 
【程序说明】在inner()函数中使用了nonlocal关键字声明num，即inner()函数中的num就是outer()函数中的num。因此，将num修改为2后，inner()函数和outer()函数中的输出都是2。如果没有“nonlocal num”这条语句，那么在inner()函数中的num就是局部变量，其值为2，在outer()函数中的num值为1，运行结果如图5-23所示。
"""
# 嵌套曾层作用域访问上一级作用域的变量
# def outer():
#     num = 1
#     def inner():
#         nonlocal num			#nonlocal关键字声明变量
#         num = 2
#         print('inner函数中num的值：',num)
#     inner()
#     print('outer函数中num的值：',num)
# outer()

# 思考:子子作用域访问全局作用域??是使用nonlocal关键字 还是使用global关键字??
num = 1
def outer():
    def inner():
        global num  # nonlocal关键字声明变量
        num = 2
        print('inner函数中num的值：', num)
    inner()
    print('outer函数中num的值：', num)
outer()
print('全局作用域num的值是:', num)